package com.gzc.just.play.last.war.sceneserver.goods;

import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 物品管理器 - 管理游戏中所有的物品配置
 *
 * 功能：
 * - 物品配置的注册和查询
 * - 物品信息的获取
 * - 物品价格和属性查询
 *
 * 对应C++的 SGoodsConfigMgr
 *
 * @author AI编程助手
 * @version 1.0
 * @since 2025-11-22
 */
public class GoodsManager {
    
    private static final Logger log = LoggerFactory.getLogger(GoodsManager.class);
    
    private final Map<Integer, GoodsConfig> goodsMap = new HashMap<>();
    
    /**
     * 注册物品配置
     *
     * @param config 物品配置
     */
    public void registerGoods(GoodsConfig config) {
        if (config == null) {
            log.warn("试图注册空物品配置");
            return;
        }
        
        int goodsId = config.getGoodsId();
        if (goodsMap.containsKey(goodsId)) {
            log.warn("物品已存在: {}", goodsId);
            return;
        }
        
        goodsMap.put(goodsId, config);
        log.debug("注册物品: {} ({})", goodsId, config.getName());
    }
    
    /**
     * 获取物品配置
     *
     * @param goodsId 物品ID
     * @return 物品配置，如果不存在返回null
     */
    public GoodsConfig getGoods(int goodsId) {
        return goodsMap.get(goodsId);
    }
    
    /**
     * 检查物品是否存在
     */
    public boolean hasGoods(int goodsId) {
        return goodsMap.containsKey(goodsId);
    }
    
    /**
     * 获取所有物品
     */
    public Collection<GoodsConfig> getAllGoods() {
        return goodsMap.values();
    }
    
    /**
     * 获取特定类型的物品列表
     */
    public List<GoodsConfig> getGoodsByType(GoodsType type) {
        List<GoodsConfig> result = new ArrayList<>();
        for (GoodsConfig config : goodsMap.values()) {
            if (config.getGoodsType() == type) {
                result.add(config);
            }
        }
        return result;
    }
    
    /**
     * 获取特定等级的物品列表
     */
    public List<GoodsConfig> getGoodsByLevel(int level) {
        List<GoodsConfig> result = new ArrayList<>();
        for (GoodsConfig config : goodsMap.values()) {
            if (config.getLevel() == level) {
                result.add(config);
            }
        }
        return result;
    }
    
    /**
     * 获取特定稀有度的物品列表
     */
    public List<GoodsConfig> getGoodsByRarity(String rarity) {
        List<GoodsConfig> result = new ArrayList<>();
        for (GoodsConfig config : goodsMap.values()) {
            if (config.getRarity().equalsIgnoreCase(rarity)) {
                result.add(config);
            }
        }
        return result;
    }
    
    /**
     * 获取所有可交易的物品
     */
    public List<GoodsConfig> getTradeableGoods() {
        List<GoodsConfig> result = new ArrayList<>();
        for (GoodsConfig config : goodsMap.values()) {
            if (config.isTradeable()) {
                result.add(config);
            }
        }
        return result;
    }
    
    /**
     * 获取所有可售卖的物品
     */
    public List<GoodsConfig> getSellableGoods() {
        List<GoodsConfig> result = new ArrayList<>();
        for (GoodsConfig config : goodsMap.values()) {
            if (config.isSellable()) {
                result.add(config);
            }
        }
        return result;
    }
    
    /**
     * 获取物品总数
     */
    public int getGoodsCount() {
        return goodsMap.size();
    }
    
    /**
     * 清除所有物品配置
     */
    public void clearAllGoods() {
        goodsMap.clear();
        log.debug("清除所有物品配置");
    }
    
    /**
     * 获取物品摘要
     */
    public String getGoodsSummary() {
        StringBuilder sb = new StringBuilder();
        sb.append("物品库摘要:\n");
        sb.append(String.format("  总物品数: %d\n", getGoodsCount()));
        
        // 按类型统计
        Map<GoodsType, Integer> typeCount = new HashMap<>();
        for (GoodsConfig config : goodsMap.values()) {
            typeCount.put(config.getGoodsType(), 
                typeCount.getOrDefault(config.getGoodsType(), 0) + 1);
        }
        
        sb.append("  按类型分布:\n");
        for (GoodsType type : GoodsType.values()) {
            if (type != GoodsType.UNKNOWN && typeCount.containsKey(type)) {
                sb.append(String.format("    - %s: %d\n", 
                    type.getDisplayName(), typeCount.get(type)));
            }
        }
        
        return sb.toString();
    }
}
